package string;

/**
 * 给你一个字符串 s 和一个整数 t，表示要执行的 转换 次数。每次 转换 需要根据以下规则替换字符串 s 中的每个字符：
 * 如果字符是 'z'，则将其替换为字符串 "ab"。
 * 否则，将其替换为字母表中的下一个字符。例如，'a' 替换为 'b'，'b' 替换为 'c'，依此类推。
 * 返回 恰好 执行 t 次转换后得到的字符串的 长度。
 * 由于答案可能非常大，返回其对 109 + 7 取余的结果。
 * <p>
 * 示例 1：
 * 输入： s = "abcyy", t = 2
 * 输出： 7
 * 解释：
 * 第一次转换 (t = 1)
 * 'a' 变为 'b'
 * 'b' 变为 'c'
 * 'c' 变为 'd'
 * 'y' 变为 'z'
 * 'y' 变为 'z'
 * 第一次转换后的字符串为："bcdzz"
 * 第二次转换 (t = 2)
 * 'b' 变为 'c'
 * 'c' 变为 'd'
 * 'd' 变为 'e'
 * 'z' 变为 "ab"
 * 'z' 变为 "ab"
 * 第二次转换后的字符串为："cdeabab"
 * 最终字符串长度：字符串为 "cdeabab"，长度为 7 个字符。
 * <p>
 * 示例 2：
 * 输入： s = "azbk", t = 1
 * 输出： 5
 * 解释：
 * 第一次转换 (t = 1)
 * 'a' 变为 'b'
 * 'z' 变为 "ab"
 * 'b' 变为 'c'
 * 'k' 变为 'l'
 * 第一次转换后的字符串为："babcl"
 * 最终字符串长度：字符串为 "babcl"，长度为 5 个字符。
 *
 * @author Jisheng Huang
 * @version 20250513
 */
public class LenAfterTrans_3335 {
    static int MOD = 1000000007;

    /**
     * @param s the given string
     * @param t the number of time can perform the transformation
     * @return
     */
    public static int lengthAfterTransformations(String s, int t) {
        int[] cnt = new int[26];

        for (char ch : s.toCharArray()) {
            ++cnt[ch - 'a'];
        }

        for (int round = 0; round < t; ++round) {
            int[] nxt = new int[26];
            nxt[0] = cnt[25];
            nxt[1] = (cnt[25] + cnt[0]) % MOD;

            for (int i = 2; i < 26; ++i) {
                nxt[i] = cnt[i - 1];
            }

            cnt = nxt;
        }

        int ans = 0;

        for (int i = 0; i < 26; ++i) {
            ans = (ans + cnt[i]) % MOD;
        }

        return ans;
    }

    public static void main(String[] args) {
        String s = "abcyy";
        int t = 2;

        System.out.println(lengthAfterTransformations(s, t));

        s = "azbk";
        t = 1;

        System.out.println(lengthAfterTransformations(s, t));
    }
}
